package modelo.hibernate.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import modelo.entidad.Anuncio;
import modelo.entidad.Costo;
import modelo.entidad.Inmueble;
import modelo.entidad.Usuario;
import modelo.hibernate.config.Sesion;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

public class DaoAnuncio {
	private Sesion sesionPostgres;
	
	
	
	public void agregarAnuncio(Anuncio dato) throws Exception{
		@SuppressWarnings("static-access")
		Session em = sesionPostgres.openSession();  
         Transaction tx = null;  
         try {    
        	 tx = em.beginTransaction();
              em.save( dato);   
              tx.commit();  
         } catch (Exception e) {  
             tx.rollback();            
             e.printStackTrace();
             throw e;
         } finally {  
             em.close();  
         } 
	}
	
	public Anuncio obtenerAnuncio(int id) throws Exception{		 
	    @SuppressWarnings("static-access")
		Session sesion = sesionPostgres.openSession();  
            Anuncio dato = null;        
            try{
                dato = (Anuncio) sesion.get(Anuncio.class,  id);
            } catch (Exception e) {  
            e.printStackTrace();
           
            throw new Exception(e.getMessage(),e.getCause());
            }  finally {  
                sesion.close();  
            }  
           
	    return dato;
}

	
	public List<Anuncio> obtenerAnunciosbyUsuario(Usuario dato) throws Exception {            
	      
		List<Anuncio> datos = new ArrayList<Anuncio>();  
	  Session em = sesionPostgres.openSession();  	
        try {  	
	    datos =  (List<Anuncio>) em.createCriteria(Anuncio.class).add(Restrictions.eq("usuario",dato)).list();             
        } catch (Exception e) {             
       
         throw new Exception(e.getMessage(),e.getCause());
        } finally {  
          em.close();  
        } 
       
        return datos; 
	}	

	/*
	public List<Anuncio> obtenerAnunciosActivosbyUsuario(Usuario dato) throws Exception {            
	      
		List<Anuncio> datos = new ArrayList<Anuncio>();  
	  Session em = sesionPostgres.openSession();  	
        try {  	
	    datos =  (List<Anuncio>) em.createCriteria(Anuncio.class).add(Restrictions.eq("usuario",dato) && Restrictions.eq("estatus", "A")).list();             
        } catch (Exception e) {             
       
         throw new Exception(e.getMessage(),e.getCause());
        } finally {  
          em.close();  
        } 
       
        return datos; 
	}	
*/
	
	public void eliminarAnuncio(Anuncio dato) throws Exception{		 
		@SuppressWarnings("static-access")
		Session sesion = sesionPostgres.openSession();  
        Transaction tx = null;  
        try {  
            tx = sesion.beginTransaction();  
            sesion.delete(dato);  
            tx.commit();  
           
        } catch (Exception e) {  
            tx.rollback();  
           
            throw new Exception(e.getMessage(), e.getCause());
        } finally {  
            sesion.close();  
        }  
   }
	
	public void actualizarAnuncio(Anuncio dato) throws Exception{
		@SuppressWarnings("static-access")
		Session em = sesionPostgres.openSession();  
         Transaction tx = null;  
         try {    
        	 tx = em.beginTransaction();
              em.update(dato);   
              tx.commit();  
         } catch (Exception e) {  
             tx.rollback();            
             e.printStackTrace();
             throw e;
         } finally {  
             em.close();  
         } 
	}
	
	public List<Anuncio> obtenerTodos() throws Exception {            
      
		List<Anuncio> datos = new ArrayList<Anuncio>();  
		Session em = sesionPostgres.openSession();  	
        try {  	
	    datos =  (List<Anuncio>) em.createCriteria(Anuncio.class).list();             
        } catch (Exception e) {             
       
         throw new Exception(e.getMessage(),e.getCause());
        } finally {  
          em.close();  
        } 
       
        return datos; 
	}	

	public List<Costo> obtenerTodosCostos() throws Exception {            
	      
	  List<Costo> datos = new ArrayList<Costo>();  
	  Session em = sesionPostgres.openSession();  	
        try {  	
	    datos =  (List<Costo>) em.createCriteria(Costo.class).list();             
        } catch (Exception e) {             
       
         throw new Exception(e.getMessage(),e.getCause());
        } finally {  
          em.close();  
        } 
       
        return datos; 
	}	
	
	public Costo obtenerCostoActual() throws Exception {            
		  List<Costo> datos = obtenerTodosCostos();  
		  System.out.println(datos.size());
          Costo costo = datos.get(0);
		  for(int i=0; i<datos.size(); i++)
		  {
			  if(costo.getFecha().before(datos.get(i).getFecha()))
				costo = datos.get(i);	  
		  }
		  return costo;
	}
	

}